﻿using System.Collections.Generic;
using System;
using System.Data.SqlClient;
namespace EstoqueUnifeiADO.Dados
{


    public partial class dsMovimentacao
    {
    }
}
namespace EstoqueUnifeiADO.Dados.dsMovimentacaoTableAdapters
{
    public partial class MOVIMENTOTableAdapter
    {

        public void MovimentaEstoque(List<ProdQuant> produtos, Nullable<int> estoqueOrigem, Nullable<int> estoqueDestino,
          string observacao, int codFuncionario, Nullable<int> codUsuarioRequisicao, TipoMovimentacao tipoMovimento, SqlTransaction trans)
        {
            //Para determinar se a transação iniciou neste adapter
            bool transactionStartWhere = (trans == null);
            try
            {

                if (trans == null)
                    trans = TableAdapterHelper.BeginTransaction(this);

                int codmovimento = Convert.ToInt32(this.InsertWithKey(codFuncionario, codUsuarioRequisicao, estoqueOrigem, estoqueDestino, Convert.ToInt32(tipoMovimento), DateTime.Now, observacao));
                switch (tipoMovimento)
                {
                    case TipoMovimentacao.EntraMercadoria:
                        AtualizaMovimentoItem(produtos, codmovimento, estoqueDestino.Value, TipoMovimentacao.EntradaProduto, trans);
                        break;
                    case TipoMovimentacao.EntradaFapep:
                        AtualizaMovimentoItem(produtos, codmovimento, estoqueDestino.Value, TipoMovimentacao.EntradaProduto, trans);
                        break;
                    case TipoMovimentacao.EntradaProduto:
                        AtualizaMovimentoItem(produtos, codmovimento, estoqueDestino.Value, TipoMovimentacao.EntradaProduto, trans);
                        break;
                    case TipoMovimentacao.RetiradaProduto:
                        AtualizaMovimentoItem(produtos, codmovimento, estoqueOrigem.Value, TipoMovimentacao.RetiradaProduto, trans);
                        break;
                    case TipoMovimentacao.TransferenciaProduto:
                        AtualizaMovimentoItem(produtos, codmovimento, estoqueOrigem.Value, TipoMovimentacao.RetiradaProduto, trans);
                        AtualizaMovimentoItem(produtos, codmovimento, estoqueDestino.Value, TipoMovimentacao.EntradaProduto, trans);
                        break;
                    default:
                        break;
                }
                if (transactionStartWhere)
                    trans.Commit();

            }
            catch (Exception ex)
            {
                if (transactionStartWhere)
                    trans.Rollback();
                throw ex;

            }
            finally
            {
                if (transactionStartWhere)
                    trans.Dispose();
            }


        }
        private void AtualizaMovimentoItem(List<ProdQuant> produtos, int codMovimento, int estoque, TipoMovimentacao tipomov, SqlTransaction trans)
        {

            using (dsEstoqueProdutoTableAdapters.ESTOQUEPRODUTOTableAdapter taEstoqueProduto = new dsEstoqueProdutoTableAdapters.ESTOQUEPRODUTOTableAdapter())
            {
                TableAdapterHelper.SetTransaction(taEstoqueProduto, trans);
                using (MOVIMENTOITEMTableAdapter taMovimentoItem = new MOVIMENTOITEMTableAdapter())
                {

                    TableAdapterHelper.SetTransaction(taMovimentoItem, trans);
                    foreach (var item in produtos)
                    {
                        dsEstoqueProduto.ESTOQUEPRODUTODataTable estoqueProduto =
                            taEstoqueProduto.GetProdutoByCodigoEEstoque(estoque, item.CodProduto);

                        if (estoqueProduto.Count.Equals(0))
                        {
                            //Inserir estoque produto

                            //Validando se é retirada e o produto não existe no estoque origem
                            if (tipomov.Equals(TipoMovimentacao.RetiradaProduto))
                                throw new Exception(string.Format("Quantidade do estoque insuficiente para o " +
                                    "produto \"{0}\", cancelando operação", item.NomeProduto));

                            //Inserindo movimento
                            taMovimentoItem.Insert(codMovimento, estoque, item.CodProduto, Convert.ToInt32(tipomov), item.Quantidade, 0, item.Quantidade);

                            //Inserindo Produto no Estoque Produto
                            taEstoqueProduto.InsereProdutoNoEstoque(estoque, item.CodProduto, item.Quantidade);
                        }
                        else
                        {
                            //alterar quantidade
                            dsEstoqueProduto.ESTOQUEPRODUTORow produtoDoEstoque = estoqueProduto[0];
                            //Validando a quantidade em caso de retirada
                            if (tipomov.Equals(TipoMovimentacao.RetiradaProduto) &&
                                item.Quantidade > produtoDoEstoque.QUANTIDADE)
                                throw new Exception(string.Format("Quantidade do estoque insuficiente para o " +
                                    "produto \"{0}\", cancelando operação", item.NomeProduto));

                            //Inserindo Movimento para o item
                            decimal quantidadeAtual = tipomov.Equals(TipoMovimentacao.RetiradaProduto) ? (produtoDoEstoque.QUANTIDADE - item.Quantidade)
                                : produtoDoEstoque.QUANTIDADE + item.Quantidade;

                            taMovimentoItem.Insert(codMovimento, estoque, item.CodProduto, Convert.ToInt32(tipomov), item.Quantidade, produtoDoEstoque.QUANTIDADE,
                                quantidadeAtual);

                            //Atualizando valores do estoque destino
                            taEstoqueProduto.AtualizaQuantidadeNoEstoque(quantidadeAtual, produtoDoEstoque.CODESTOQUEPRODUTO);
                        }
                        using (dsProdutosTableAdapters.PRODUTOTableAdapter taProduto = new dsProdutosTableAdapters.PRODUTOTableAdapter())
                        {
                            TableAdapterHelper.SetTransaction(taProduto, trans);
                            dsProdutos.PRODUTORow produto = taProduto.GetDataByID(item.CodProduto)[0];
                            decimal quantProd = produto.IsQUANTIDADENull() ? 0 : produto.QUANTIDADE;
                            decimal quantidade = (tipomov.Equals(TipoMovimentacao.RetiradaProduto) ? quantProd - item.Quantidade
                                : quantProd + item.Quantidade);
                            taProduto.AtualizaQuantidade(quantidade,item.CodProduto);
                            
                        }

                    }

                }

            }
        }

    }
}
